package in.model; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import in.data.AnnotationList; import in.data.Text; import in.data.annotation.CheckinAnnotation; import in.data.annotation.CrossPostAnnotation; import in.data.annotation.ImageAnnotation; import in.data.annotation.LocationAnnotation; import in.data.annotation.VideoAnnotation; import in.data.entity.LinkEntity; import in.data.entity.MentionEntity; import in.lib.manager.UserManager; import in.lib.utils.Debug; import in.lib.utils.SerialReaderUtil; import in.lib.utils.SerialWriterUtil; import in.lib.utils.URLUtils; import lombok.Data; @Data public class Message extends AdnModel { protected Text postText; protected User poster; protected long date; protected String dateStr; protected String canonicalUrl; protected String timeZone; protected String clientName; protected String clientLink; protected String replyTo; protected boolean machinePost; protected boolean newPost = false; protected boolean deleted = false; protected AnnotationList annotations; public boolean isMention() { return isMention(UserManager.getInstance().getUser().getId()); } public boolean isMention(String userId) { if (postText.getMentions() != null) { for (MentionEntity mention : postText.getMentions()) { if (mention.getId().equals(userId)) { return true; } } } return false; } @Override public Message createFrom(JsonElement element) { try { JsonObject postObject = element.getAsJsonObject(); this.id = postObject.get("id").getAsString(); this.poster = new User().createFrom(postObject.get("user")); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); Date postDate = format.parse(postObject.get("created_at").getAsString()); this.date = postDate.getTime(); this.dateStr = new SimpleDateFormat().format(postDate); this.timeZone = postObject.get("user").getAsJsonObject().get("timezone").getAsString(); this.clientName = postObject.get("source").getAsJsonObject().get("name").getAsString(); this.clientLink = postObject.get("source").getAsJsonObject().get("link").getAsString(); if (postObject.has("canonical_url")) { this.canonicalUrl = postObject.get("canonical_url").getAsString(); } if (postObject.has("reply_to")) { this.replyTo = postObject.get("reply_to").getAsString(); } if (postObject.has("is_deleted")) { this.deleted = postObject.get("is_deleted").getAsBoolean(); } if (!deleted) { this.postText = new Text().createFrom(postObject); } if (postObject.has("annotations")) { JsonArray annotationArray = postObject.get("annotations").getAsJsonArray(); this.annotations = parseAnnotations(annotationArray); } return this; } catch (Exception e) { Debug.out(e); } return null; } @Override public List<? extends Message> createListFrom(JsonElement element) { try { JsonArray postArray = element.getAsJsonArray(); ArrayList<Message> posts = new ArrayList<Message>(postArray.size()); for (JsonElement postElement : postArray) { Message post = new Message().createFrom(postElement); if (post != null) { posts.add(post); } } return posts; } catch (Exception e) { Debug.out(e); } return null; } @Override public Message createFrom(Parcel parcel) { super.createFrom(parcel); return this; } public AnnotationList parseAnnotations(JsonArray annotationArray) { ArrayList<String> tmpImageList = new ArrayList<String>(); AnnotationList map = new AnnotationList(); if (annotationArray.size() > 0) { for (JsonElement annotationElement : annotationArray) { JsonObject annotationObject = annotationElement.getAsJsonObject(); JsonObject value = annotationObject.get("value").getAsJsonObject(); String type = annotationObject.get("type").getAsString(); if (type.equals("net.app.core.oembed") && value.has("type")) { if (value.get("type").getAsString().equalsIgnoreCase("photo")) { ImageAnnotation image = new ImageAnnotation().createFrom(value); if (image != null && !map.getImages().contains(image)) { map.getImages().add(image); tmpImageList.add(image.getUrl()); } } else if (value.get("type").getAsString().equalsIgnoreCase("video")) { VideoAnnotation video = new VideoAnnotation().createFrom(value); if (video != null && !map.getVideos().contains(video)) { map.getVideos().add(video); } } } else if (type.equals("net.app.core.geolocation")) { LocationAnnotation location = new LocationAnnotation().createFrom(value); if (location != null && !map.getLocations().contains(location)) { map.getLocations().add(location); } } else if (type.equals("net.app.core.checkin")) { CheckinAnnotation location = new CheckinAnnotation().createFrom(value); if (location != null && !map.getLocations().contains(location)) { map.getLocations().add(location); } } else if (type.equals("net.app.core.crosspost")) { CrossPostAnnotation crosspost = new CrossPostAnnotation().createFrom(value); if (crosspost != null && !map.getCrossposts().contains(crosspost)) { map.getCrossposts().add(crosspost); } } } } if (postText != null && postText.getLinks().size() > 0) { for (LinkEntity link : postText.getLinks()) { Uri uri = Uri.parse(link.getUrl()); if (URLUtils.isImage(uri) && !tmpImageList.contains(link.getUrl())) { ImageAnnotation image = new ImageAnnotation(); image.setUrl(link.getUrl()); image.setTextUrl(link.getUrl()); image.setEmbeddableUrl(link.getUrl()); tmpImageList.add(link.getUrl()); if (!map.getImages().contains(image)) { map.getImages().add(image); } } } } return map; } @Override public String getVersion() { return "44f3c4c6-00a0-4a1e-b144-7d4584ffe031"; } @Override public void write(SerialWriterUtil util) { super.write(util); try { util.writeString(getVersion()); util.writeModel(postText); util.writeModel(poster); util.writeLong(date); util.writeString(dateStr); util.writeString(canonicalUrl); util.writeString(timeZone); util.writeString(clientName); util.writeString(clientLink); util.writeString(replyTo); util.writeBoolean(machinePost); util.writeBoolean(newPost); util.writeBoolean(deleted); util.writeModel(annotations); } catch (Exception e) { Debug.out(e); } } @Override public Message read(SerialReaderUtil util) { if (super.read(util) != null) { try { String version = util.readString(); if (!version.equals(getVersion())) return null; postText = util.readModel(Text.class); poster = util.readModel(User.class); date = util.readLong(); dateStr = util.readString(); canonicalUrl = util.readString(); timeZone = util.readString(); clientName = util.readString(); clientLink = util.readString(); replyTo = util.readString(); machinePost = util.readBoolean(); newPost = util.readBoolean(); deleted = util.readBoolean(); annotations = util.readModel(AnnotationList.class); return this; } catch (Exception e) { Debug.out(e); } } return null; } public static final Parcelable.Creator<Message> CREATOR = new Creator<Message>() { @Override public Message[] newArray(int size) { return new Message[size]; } @Override public Message createFromParcel(Parcel source) { return new Message().createFrom(source); } }; }